#ifndef __HF_DEV_ABSTRACT_H__
#define __HF_DEV_ABSTRACT_H__

#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define HF_DEVICE_FLAG_RDONLY           0x001           /**< read only */
#define HF_DEVICE_FLAG_WRONLY           0x002           /**< write only */
#define HF_DEVICE_FLAG_RDWR             0x003           /**< read and write */

enum hf_device_type
{
    E_DEVICE_I2C = 0x001,                        /**< I2C device */
    E_DEVICE_SPI,                                /**< SPI device */
    E_DEVICE_TIMER,                              /**< Timer device */
    E_DEVICE_SENSOR,                             /**< Sensor device */
    E_DEVICE_PIN,                                /**< Pin device */
    E_DEVICE_ADC,                                /**< ADC device */
    E_DEVICE_DAC,                                /**< DAC device */
    E_DEVICE_WDT,                                /**< WDT device */
    E_DEVICE_PWM,                                /**< PWM device */
    E_DEVICE_UNKNOWN,                            /**< unknown device */
};

struct hf_device {
    const struct hf_driver_ops *ops;             /* 设备操作方法 */
    enum hf_device_type type;                    /* 设备类型 */
    const char *name;                            /* 设备名称 */
};



struct hf_driver_ops {
    int8_t (*open)(struct hf_device *dev);
    int8_t (*close)(struct hf_device *dev);
    int8_t (*read)(struct hf_device *dev, uint8_t *p_data, uint16_t size);
    int8_t (*write)(struct hf_device *dev, uint8_t *p_data, uint16_t size);
    int8_t (*ioctl)(struct hf_device *dev, uint32_t cmd, void *arg);
};

/**
 * @brief  注册设备
 * @param  dev: 设备指针
 * @param  type: 设备类型
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_register(struct hf_device *dev, enum hf_device_type type);

/**
 * @brief  统一打开设备
 * @param  dev: 设备指针
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_open(struct hf_device *dev);

/**
 * @brief  统一关闭设备
 * @param  dev: 设备指针
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_close(struct hf_device *dev);

/**
 * @brief  统一读数据
 * @param  dev: 设备指针
 * @param  p_data: 数据缓冲区
 * @param  size: 长度
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_read(struct hf_device *dev, uint8_t *p_data, uint16_t size);

/**
 * @brief  统一写数据
 * @param  dev: 设备指针
 * @param  p_data: 数据缓冲区
 * @param  size: 长度
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_write(struct hf_device *dev, uint8_t *p_data, uint16_t size);

/**
 * @brief  统一控制操作（e.g., 设置寄存器）
 * @param  dev: 设备指针
 * @param  cmd: 命令码
 * @param  arg: 参数指针
 * @retval ERR_OK 或错误码
 */
int8_t hf_device_ioctl(struct hf_device *dev, uint32_t cmd, void *arg);

#ifdef __cplusplus
}

#endif /* __HF_DEV_ABSTRACT_H__ */